}
{ }
j=_crol_(j,1);
P3=j;
P0=DSY_CODE[Digits_of_6DSY[i]]; if(i==1) Dot=1; //加小数点 DelayMS(2);
}
//T0中断函数
void Timer0() interrupt 1 { uchar i; TH0=(65536-50000)/256; }
35 定时器控制数码管动态显示
/* 名称:定时器控制数码管动态显示
说明:8个数码管上分两组动态显示年月日与时分秒,本例的 位显示延时用定时器实现。 */
#include
#define uchar unsigned char #define uint unsigned int
//段码,最后一位是“-”的段码
uchar code
DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //待显示的数据:09-12-25与23-59-58(分两组显示)
36
//恢复初值
TL0=(65536-50000)%6;
if(++Count!=2) return; Count=0;
Digits_of_6DSY[0]++; //0.1s位累加 for(i=0;i<=5;i++) //进位处理 { }
if(Digits_of_6DSY[i]==10) {
Digits_of_6DSY[i]=0;
if(i!=5) Digits_of_6DSY[i+1]++; //如果0~4位则分别向高一位进位
//若某低位没有进位,怎循环提前结束
}
else break;
uchar code Table_of_Digits[][8]={{0,9,10,1,2,10,2,5},{2,3,10,5,9,10,5,8}}; uchar i,j=0; uint t=0; //主程序
void main() { P3=0x80; TMOD=0x00;
//位码初值 //计数器T0方式0
TH0=(8192-4000)/32; //4ms定时 TL0=(8192-4000)2; IE=0x82;
TR0=1; while(1);
//启动T0
}
//T0中断函数控制数码管刷新显示 void DSY_Show() interrupt 1 { TH0=(8192-4000)/32; }
36 8X8LED点阵显示数字
/* 名称:8X8LED点阵显示数字 说明:8X8LED点阵屏循环显示数字0~9,刷新过程由定时器中断完成。 */
#include
uchar code Table_of_Digits[]= {
//恢复初值
TL0=(8192-4000)2; P0=0xff; //输出位码和段码
P0=DSY_CODE[Table_of_Digits[i][j]]; P3=_crol_(P3,1); j=(j+1)%8; //数组第i行的下一字节索引 if(++t!=350) return;//保持刷新一段时间 t=0;
i=(i+1)%2;
//数组行i=0时显示年月日,i=1时显示时分秒
0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, 0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, 0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, 0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //0 //1 //2 //3
37
0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, 0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,
//4 //5 //6 //7 //8 //9
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, 0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00 };
uchar i=0,t=0,Num_Index; //主程序 void main() {
P3=0x80; Num_Index=0;
//从0开始显示 //T0方式0 //2ms定时
TMOD=0x00; TH0=(8192-2000)/32; TL0=(8192-2000)2; IE=0x82; TR0=1; while(1);
//启动T0
}
//T0中断函数
void LED_Screen_Display() interrupt 1 { }
TH0=(8192-2000)/32;
//恢复初值
TL0=(8192-2000)2; P0=0xff; //输出位码和段码
P0=~Table_of_Digits[Num_Index*8+i]; P3=_crol_(P3,1); if(++i==8) i=0; //每屏一个数字由8个字节构成 if(++t==250) { }
//每个数字刷新显示一段时间
t=0;
if(++Num_Index==10) Num_Index=0; //显示下一个数字
37 按键控制8X8LED点阵屏显示图形
/* 名称:按键控制8X8LED点阵屏显示图形
说明:每次按下K1时,会使8X8LED点阵屏循环显示不同图形。
本例同时使用外部中断和定时中断。 */
38
#include
uchar code M[][8]= { {0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00}, //图1 {0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00}, //图2
{0x00,0x20,0x30,0x38,0x3c,0x3e,0x00,0x00}
//图3
};
uchar i,j; //主程序 void main() { P0=0xff; P1=0xff; TMOD=0x01; //T0方式1 TH0=(65536-2000)/256; //2ms定时
TL0=(65536-2000)%6; IT0=1; //下降沿触发 IE=0x83; //允许定时器0、外部0中断 i=0xff;
//i的初值设为0xff,加1后将从0开始
while(1);
}
//T0中断控制点阵屏显示
void Show_Dot_Matrix() interrupt 1 { TH0=(65536-2000)/256; //恢复初值 TL0=(65536-2000)%6; P0=0xff; //输出位码和段码 P0=~M[i][j];
P1=_crol_(P1,1);
j=(j+1)%8; }
//INT0中断(定时器由键盘中断启动) void Key_Down() interrupt 0 { P0=0xff; P1=0x80; j=0;
i=(i+1)%3;
//i在0,1,2中取值,因为只要3个图形
TR0=1;
}
39
38 用定时器设计的门铃
/* 名称:用定时器设计的门铃 说明:按下按键时蜂鸣器发出叮咚的门铃声。 */
#include
#define uchar unsigned char #define uint unsigned int sbit Key=P1^7; sbit DoorBell=P3^0; uint p=0; //主程序 void main() {
DoorBell=0; TMOD=0x00; TH0=(8192-700)/32; TL0=(8192-700)2; IE=0x82; while(1) {
if(Key==0) {
TR0=1;
//按下按键启动定时器
//T0方式0 //700us定时
while(Key==0); } } }
//T0中断控制点阵屏显示
void Timer0() interrupt 1 { DoorBell=~DoorBell; p++; if(p<400) //若需要拖长声音,可以调整400和800
{ }
TH0=(8192-700)/32; //700us定时 TL0=(8192-700)2;
else if(p<800) { TH0=(8192-1000)/32; //1ms定时 } else {
40
TL0=(8192-1000)2;