例 4.1.1用数码管的前两位显示一个十进制数,变化范围为 00~59, 开始时显示 00, 每按下S2 键一次, 数值加 1; 每按下S3 键一次, 数值减 1;每按下 S4 键一次, 数值归零; 按下 S5 键一次, 利用定时器功能使数值开始自动每秒加 1, 再次按下 S5 键, 数值停止自动加 1, 保持显示原数。新建文件 jianpan.c, 程序代码如下: ?
#include <reg52.h> ? ? ? ? //52系列单片机头文件 #define uchar unsigned char #define uint unsigned int sbit key1 = P3^4; sbit key2 = P3^5; sbit key3 = P3^6; sbit key4 = P3^7; sbit dula = P2^5;?? ??? ? ? //申明U1锁存器的锁存端 sbit wela = P2^6;?? ??? ? ? //申明U2锁存器的锁存端 uchar code table[]={ 0xC0, /*/"0"*/ 0xF9, /*/"1"*/ 0xA4, /*/"2"*/ 0xB0, /*/"3"*/ 0x99, /*/"4"*/ 0x92, /*/"5"*/ 0x82, /*/"6"*/ 0xF8, /*/"7"*/ 0x80, /*/"8"*/ 0x90, /*/"9"*/ 0x88, /*/"A"*/ 0x83, /*/"B"*/ 0xC6, /*/"C"*/ 0xA1, /*/"D"*/ 0x86, /*/"E"*/ 0x8E, /*/"F"*/ 0x89, /*/"H"*/ 0xC7, /*/"L"*/ 0xC8, /*/"n"*/ 0xC1, /*/"u"*/ 0x8C, /*/"P"*/ 0xA3, /*/"o"*/ 0xBF, /*/"-"*/ 0xFF, /*/熄灭*/ 0xFF /*/自定义*/ }; void delayms(uint xms);?? ? ? uchar num,numt0; ? void dispaly(uchar numdis) ?//显示子函数 { ?? ?uchar shi,ge; ?? ?shi=numdis/10; ?? ?ge=numdis%10;
?? ?dula=1; ?? ?P0=table[shi]; ?//送段选数据 ?? ?dula=0; ?? ? ?? ?P0=0xff?? ?;?? ? ?//送位选数据前关闭所有显示,防止打开位选锁存时 ?? ? ? ? wela=1;?? ? ? ? ?//原来段选数据通过位选锁存器造成混乱 ? ? P0=0x01?? ?;?? ? ?//送位选数据 ? ? wela=0;?? ??? ? ?//关闭U2锁存器 ?? ?delayms(5); //延时
?? ?dula=1; ?? ?P0=table[ge]; ?//送段选数据 ?? ?dula=0; ?? ? ?? ?P0=0xff?? ?;?? ? ?//送位选数据前关闭所有显示,防止打开位选锁存时 ?? ? ? ? wela=1;?? ? ? ? ?//原来段选数据通过位选锁存器造成混乱 ? ? P0=0x02?? ?;?? ? ?//送位选数据 ? ? wela=0;?? ??? ? ?//关闭U2锁存器 ?? ?delayms(5); //延时 } void init() ?//初始化函数 { ? TMOD=0x01; ?//设置定时器0为工作方式1(0000 0001) ? TH0=(65536-45872)/256;//装初值50ms一次中断 ? TL0=(65536-45872)%256;//装初值50ms一次中断 ? EA=1;?? ??? ?//开总中断 ? ET0=1;?? ?//开定时器0中断 } void keyscan() { ? ?if(key1==0) ? ?{ ? ? ? delayms(10); ?? ? ?if(key1==0) ?? ? ?{ ?? ? ? ?num++; ?? ??? ?if(num==60)?? ? //当到60时重新归0 ?? ??? ? ?num=0; ?? ??? ?while(~key1);//等待按键释放 ?? ??? ?} ?? ?} ? ?if(key2==0) ? ?{ ? ? ? delayms(10); ?? ? ?if(key2==0) ?? ? ?{ ?? ??? ?if(num==0)?? ? //当到0时重新归60 ?? ??? ? ?num=60; ?? ??? ? ?num--; ?? ??? ?while(~key2);//等待按键释放 ?? ??? ?} ?? ?} ? ?if(key3==0) ? ?{ ? ? ? delayms(10); ?? ? ?if(key3==0) ?? ? ?{ ?? ??? ?num=0;?? ??? ? //清零 ?? ??? ?while(~key3);//等待按键释放 ?? ??? ?} ?? ?} ? ?if(key4==0) ? ?{ ? ? ? delayms(10); ?? ? ?if(key4==0) ?? ? ?{ ?? ??? ?while(~key4);//等待按键释放 ?? ??? ?TR0=~TR0;//启动或停止定时器0 ?? ??? ?} ?? ?} } void T0_time()interrupt 1 { ? TH0=(65536-45872)/256;//重装初值 ? TH0=(65536-45872)%256; ? numt0++;?? ??? ??? ??? ?//num每加一次判断一次是否到了20次 ? if(numt0==20) ? { ? ? numt0=0; ?? ?num++; ?? ?if(num==60) ?? ?num=0; ?? ?} } void main() { ?? ?init(); ?? ?while(1) ?? ?{ ?? ? ?keyscan(); ?? ? ?dispaly(num); ?? ? ?} ?? ?}
void delayms(uint xms) { ?? ?uint i,j; ?? ?for(i=xms;i>0;i--) ?? ??? ?for(j=110;j>0;j--); ?? ?} ?
|