📄 gen_display.c
字号:
/**************** File:exp10c.c ***************************
*功能:取得随机数0-9,并依次组成8位号码,输出显示。
*说明:时间时钟,显示 时 分 秒 时间设置使用Key1 ~Key3
* 将跳线器J2、J13、J16分加短接到LED_/CS、MOSI、SPICLK端;
* 通过跳线器J8、J9选择高频晶振6MHz
***************************************************************/
#include < reg935.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp=0x00;
uchar j;
uchar key1_val=0;//key2_val=0,key3_val=0,key4_val=0;
uchar tenms=0x00,second=0,minute=0,hour=12; //时钟初始时间
uchar Buffer[6];
/* ZLG7289驱动定义 */
sbit ZLG7289_CS=P2^0;
sbit ZLG7289_CLK=P2^5;
sbit ZLG7289_DIO=P2^2;
/*按键管脚定义*/
sbit Key1=P0^0;
sbit Key2=P0^1;
sbit Key3=P0^2;
sbit Key4=P0^3;
//uchar temp2=0x00;
//按键定义
sbit KEY1=P0^0;
//函数声明
void IO_init();
void TIM_init();
void ZLG7289_com(uchar dat);
void Delay_S(uchar );
void Delay_L(uint ) ;
void Delay_TF0(uchar t);
void ZLG7289_SENDBYTE(uchar dat);
void ZLG7289_SENDDAT(uchar dat,uchar loc);
void TMdisplay();
void DCB_convert();
void Set_time();
/*函数定义*/
void IO_init()
{
P0M1=0x00; // 端口设置 Key1~key4
P0M2=0x00;
P2M1=0x00; //spi
P2M2=0x00;
}
void TIM_init()
{
/*使用定时器0:工作在定时器状态十六位计数*/
TMOD = (TMOD & 0xF0) | 0x01; /* Set T/C0 Mode 用作定时器*/
TH0=(65536-30000)/256; /*中断设置初始化 */
TL0=(65536-30000)%256;
ET0 = 1; /* T0中断分路开关*/
TR0 = 1; /* T0开关TR0 */
EA = 1;
}
void ZLG7289_com(uchar dat)
{
ZLG7289_CLK=0;
ZLG7289_CS=0;
ZLG7289_SENDBYTE(dat);
ZLG7289_CS=1;
}
/*us级短延时*/
void Delay_S(uchar n)
{
uchar j;
while(n>0)
{
for(j=0;j<20;j--);
n--;
}
}
/*ms级短延时*/
void Delay_L(uint n)
{
uint i,j;
i=j=n;
while(n>0)
{
while(i>0)
{
while(j>0)
{
j--;
}
i--;
}
n--;
}
}
void Delay_TF0(uchar t)
{
do
{
while(!TF0);
}while(--t);
}
void ZLG7289_SENDBYTE(uchar dat)
{
uchar i;
Delay_S(5);
//ZLG7289_CS=0;
for (i=0; i<0x8; i++)
{ //ZLG7289_CLK=0;
if ( (dat&0x80)!=0 )ZLG7289_DIO=1; //设置数据线
else ZLG7289_DIO=0;
Delay_S(1);
ZLG7289_CLK=1;
Delay_S(1);
ZLG7289_CLK=0;
dat=dat<<1; //移动数据
}
ZLG7289_DIO=0;
//ZLG7289_CS=1; //关闭
}
void ZLG7289_SENDDAT(uchar dat,uchar loc)
{
ZLG7289_CLK=0;
ZLG7289_CS=0;
ZLG7289_SENDBYTE(loc);
ZLG7289_SENDBYTE(dat);
ZLG7289_CS=1;
}
void TMdisplay()
{
DCB_convert();
//时
ZLG7289_SENDDAT(Buffer[0],0x80);
ZLG7289_SENDDAT(Buffer[1],0x81);
ZLG7289_SENDDAT(0x0a,0x82); //"-"
//分
ZLG7289_SENDDAT(Buffer[2],0x83);
ZLG7289_SENDDAT(Buffer[3],0x84);
ZLG7289_SENDDAT(0x0a,0x85); //"-"
//秒
ZLG7289_SENDDAT(Buffer[4],0x86);
ZLG7289_SENDDAT(Buffer[5],0x87);
}
void DCB_convert()
{
//时
Buffer[1]=hour%10;
Buffer[0]=hour/10;
//分
Buffer[3]=minute%10;
Buffer[2]=minute/10;
//秒
Buffer[5]=second%10;
Buffer[4]=second/10;
}
void Set_time(void)
{
while(Key1==0)
{
//Delay_L(10);
Delay_TF0(1);
if(Key1)
{ key1_val++; key1_val%=4;}
}
switch(key1_val)
{
case 0:
ZLG7289_SENDDAT(0xdf,0x88);
break;
case 1:
if(Key2==0)
{
while(Key2==0) Delay_L(10); //Delay_L(10);
hour++;
hour%=24 ;
}
if(Key3==0)
{
while(Key3==0) Delay_L(10); //Delay_L(10);
hour--;
hour%=24 ;
}
ZLG7289_SENDDAT(0xfc,0x88);
break;
case 2:
if(Key2==0)
{
while(Key2==0) Delay_L(10); //Delay_L(10);
minute++;
minute%=60 ;
}
if(Key3==0)
{
while(Key3==0) Delay_L(10); //Delay_L(10);
minute--;
minute%=60 ;
}
ZLG7289_SENDDAT(0xe7,0x88);
break;
case 3:
if(Key2==0)
{
while(Key2==0)Delay_L(10); //Delay_L(10);
second++;
second%=60 ;
}
if(Key3==0)
{
while(Key3==0) Delay_L(10);//Delay_L(10);
second--;
second%=60 ;
}
ZLG7289_SENDDAT(0x3f,0x88);
break;
default:break;
}
}
/*********************************************************************/
/*函数:timer0_ISR(void)中断服务程序
/*功能:tenms 记时 (second , minute , hour ) */
/*********************************************************************/
void timer0_ISR (void) interrupt 1 using 1
{
tenms++;
TH0=(65536-30000)/256; //中断设置初始化
TL0=(65536-30000)%256;
//
if(tenms>=100) //满1秒
{
tenms=0; //秒数加1
if(++second>=60) //满1分
{
second=0; //分数加1,秒数归零
if(++minute>=60) //满1小时
{
minute=0; //小时数加1,分数归零
if(++hour>=24)
{ hour=0;}
}
}
}
}
void main()
{
IO_init();
ZLG7289_com(0xa4);
TIM_init(); //定时器初始设置
// ZLG7289_SENDDAT(0xdf,0x88);
while(1)
{
TMdisplay();
Set_time();
Delay_L(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -