/*****************************************************
LED点阵屏STC89C52RC单片机时钟程序
功能键:1次为调秒、2次为调分、3次为调时
4次为调星期、5次退出功能设置
编写:2013年9月16日
*****************************************************/
#include
//#include
#define uchar unsigned char
#define uint unsigned int
***it K0=P4^0; //功能键
***it K1=P4^1; // 增加
***it K2=P4^2; // 减小
***it K3=P4^3; // 蜂鸣器
uchar j,i,ee; //定义全局变量j,这里为什么要定义为全局,因为在主涵数中我们给j初值为0,和显示子程序中也用到
char miao,fen,shi;//有符号型,因为下面功能键减小时,要是定义无符号型显示不了0 ,这样让它检测到减到负1就给59
uchar dd,xiqi,s0num;
unsigned long int code table[]={
//注意这里定义的是long型长度可以更长
0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x18,0x30,0x08,0x20,0x18,0x30,0xF0,0x1F,0xE0,0x0F,/*"0",0-15*/
0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,/*"1",16-31*/
0x00,0x00,0x70,0x30,0x78,0x38,0x08,0x2C,0x08,0x26,0x88,0x23,0xF8,0x31,0x70,0x30,/*"2",32-47*/
0x00,0x00,0x30,0x18,0x38,0x38,0x88,0x20,0x88,0x20,0xC8,0x31,0x78,0x1F,0x30,0x0E,/*"3",48-63*/
0x00,0x00,0x00,0x07,0xC0,0x07,0xE0,0x24,0x30,0x24,0xF8,0x3F,0xF8,0x3F,0x00,0x24,/*"4",64-79*/
0x00,0x00,0xF8,0x19,0xF8,0x39,0x88,0x21,0x88,0x20,0x88,0x31,0x08,0x1F,0x08,0x0E,/*"5",80-95*/
0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x98,0x31,0x88,0x20,0x98,0x31,0x18,0x1F,0x00,0x0E,/*"6",96-111*/
0x00,0x00,0x38,0x00,0x38,0x00,0x08,0x3F,0xC8,0x3F,0xF8,0x00,0x38,0x00,0x08,0x00,/*"7",112-128*/
0x00,0x00,0x70,0x1C,0xF8,0x3E,0x88,0x23,0x08,0x21,0x88,0x23,0xF8,0x3E,0x70,0x1C,/*"8",129-145*/
0x00,0x00,0xE0,0x00,0xF0,0x31,0x18,0x33,0x08,0x22,0x18,0x33,0xF0,0x1F,0xE0,0x0F,/*"9",146-161*/
// 上1 下1 上2 下2 上3 下3 上4 下4 上5 下5 上6 下6 上7 下7
0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x18,0x60,0x18,0x00,0x00,0x00,0x00,0x00,0x00,/*":",162-177*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /*"灭",178-203*/
};
void delay(uint a) //带输入无符号int型变量名为a,作来延时
{
while(a--); //这种延时是最小时间的简单延时,给a一个值,让a自减1,减到0就退出while循环了
}
void display(uchar j) //带输入涵数子程序
{
uchar i; // 定义局部变量i,用来74HC138芯片的Y0-Y7输出变量
j=j*16; /*引索下面输出字符,因为每16个字符就是另一个字,如果没有这句,
主程序调用这个子程序,要显示数字几就要输入16的倍数,这样既不直观也不方便*/
// for(i=0;i<8;i++) //因为138高低位错了,所以用下面的
for(i=8;i>0;i--)/*共8行,逐行扫描,也就是74HC138的三根数据线的变化,这里i最大
只会等于7那就是0000 0111,刚好三位数据线最大变化数值,所以这三根数据线必须接在最低位上*/
{
P1=i;/* 逐一选中各行,i开始是0,这里的数指的是十进制,编译后,程序自动会转成十六进制*/
P0=table[j];/*将数据送上半屏显示,我们的屏是高16行,所以分成上8和下8,上8数据口接在P0上
因为74HC138是输出低变的,所以这里P0送的数值就得给高电平这样才能点亮 */
P2=table[j+1];/*将数据送下半屏显示,下8数据口接在P2上的,那为什么j后面要加1,因为汉字表中
我们没有将上8和下8分成两个汉字表的,都在一个汉字表中,规律是第单数位上8数据,双数位是下8数据 */
delay(30); //延时
P0=0; //P0口关闭显示,这里为什么要关闭,还不清楚
P2=0;//P1口关闭显示 ,这里为什么要关闭,还不清楚
j+=2;//为取下一行的数据几,这里暂时还不理解,但不能少了该语句
}
}
void init()
{
s0num=0; //这个变量计数为功能键按了几次
P4=0x0f; // 低4位就用来检测输入作功能键所以给高电平,高4位初值给低电平
K3=0;//上电就关闭蜂鸣器
P2=0; // 下8行的数据口
P1=0xf8; // 低三位接的74HC138的三根数据输入口,P3接着8个74HC138的控制端口
P0=0; // 上8行的数据口
j=0; //取字码表的第几个数变量
shi=0; //给时初值
fen=0; //给分初值
miao=0; //给秒初值
xiqi=1;//给星期初值
TMOD=0X01; //设计数器/定时器0为定时器,以前工作方式
TH0=(65536-46067)/256; //这里50000进20次中断为1秒,是以12M晶振的,要是用11.0592,这样时间长了就慢了
TL0=(65536-46067)%256; //如果用11.0592晶振,装初值50000时,实际是进18.3次左右为1秒
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
} |