永发信息网

液晶屏实验,怎么样做到数字一面闪烁一次,冒号0.5秒闪烁一次

答案:1  悬赏:20  手机版
解决时间 2021-03-12 06:30
  • 提问者网友:寂寞梧桐
  • 2021-03-11 21:44
程序如下!!
最佳答案
  • 五星知识达人网友:话散在刀尖上
  • 2021-03-11 23:10
//定时器寄存器地址定义
#define NVIC_STCSR (*(volatile unsigned long *)(0xE000E010))
#define NVIC_STRVR (*(volatile unsigned long *)(0xE000E014))
#define NVIC_STCVR (*(volatile unsigned long *)(0xE000E018))
//外设时钟允许寄存器地址定义
#define RCC_APB2ENA (* (volatile unsigned long *)(0x40021018))
//GPIOB寄存器地址定义
#define GPIOB_IDR (* (volatile unsigned long *)(0x40010C08))
//GPIOC寄存器地址定义
#define GPIOC_CRL (* (volatile unsigned long *)(0x40011000))
#define GPIOC_CRH (* (volatile unsigned long *)(0x40011004))
#define GPIOC_ODR (* (volatile unsigned long *)(0x4001100C))
#define GPIOC_BSRR (* (volatile unsigned long *)(0x40011010))
#define GPIOC_BRR (* (volatile unsigned long *)(0x40011014))
//函数声明
void Lcd_Write(int data,int bit);
void Lcd_Init(void);
void Lcd_Proc(char *data);
void SysTick_Init(void);
void JS(void);
//主函数
main()
{
int sec,min;
char lcd_data[8]={1,0,2,0,3,0,4,0}; //定义显示数组
SysTick_Init();
Lcd_Init(); //LCD初始化
while(1)
{
Lcd_Proc(lcd_data); //LCD显示处理
//计时程序
if(NVIC_STCSR&0x10000)
{if((++sec&0xf)==0xa) //2-10进制调整
sec+=6;
if(sec==0x60) //1分钟时间到
{
sec=0;
if((++min&0xf)==0xa) //2-10进制调整
min+=6;
if(min==0x60) //1小时时间到
min=0;
}
//将时分转换成显示数据
lcd_data[0]=min>>4; //分十位
lcd_data[2]=min&0xf; //分个位
lcd_data[4]=sec>>4; //秒十位
lcd_data[6]=sec&0xf; //秒个位
lcd_data[1]=sec&1; //分闪烁
}
};
Lcd_Write(0x400<<1,12);
}//LCD写子程序
//入口参数:data-写数据,bit-数据位数

void Lcd_Write(int data,int bit)
{
int m,n;
GPIOC_BRR=0x1000; //LCD_CS=0
for(m=bit-1;m>=0;m--)
{
for(n=0;n<10;n++); //延时
GPIOC_BRR=0x800; //LCD_WR=0
for(n=0;n<10;n++);
if(data&(1< GPIOC_BSRR=0x0400; //LCD_DA=1
else
GPIOC_BRR=0x0400; //LCD_DA=0
for(n=0;n<10;n++);
GPIOC_BSRR=0x0800; //LCD_WR=1
}
GPIOC_BSRR=0x1400; //LCD_CS=1.LCD_DA=1
}

//LCD初始化
void Lcd_Init(void)
{
RCC_APB2ENA |=0x10; //允许GPIOC时钟
GPIOC_CRH |=0x00055500; //PC12-PC10通用开漏输出
GPIOC_ODR |=0x1c00; //PC12-PC10输出高电平

Lcd_Write(0x42a<<1,12); //模块初始化
Lcd_Write(0x418<<1,12); //内部振荡器
Lcd_Write(0x401<<1,12); //开振荡器
Lcd_Write(0x403<<1,12); //开显示器
}


void Lcd_Proc(char *data)
{
char lcd_code[16]= //显示编码
{ //AFE.BGCD
0xeb, //11101011 0
0x0a, //00001010 1
0xad, //10101101 2
0x8f, //10001111 3
0x4e, //01001110 4
0xc7, //11000111 5
0xe7, //11100111 6
0x8a, //10001010 7
0xef, //11101111 8
0xcf, //11001111 9
0xee, //11101110 A
0x67, //01100111 B
0xe1, //11100001 C
0x2f, //00101111 D
0xe5, //11100101 E
0xe4 //11100100 F
};
Lcd_Write((5<<10)+(0<<4)+(lcd_code[data[0]]>>4)+data[1],13);
Lcd_Write((5<<10)+(1<<4)+(lcd_code[data[0]]&0xf),13);
Lcd_Write((5<<10)+(2<<4)+(lcd_code[data[2]]>>4)+data[3],13);
Lcd_Write((5<<10)+(3<<4)+(lcd_code[data[2]]&0xf),13);
Lcd_Write((5<<10)+(4<<4)+(lcd_code[data[4]]>>4)+data[5],13);
Lcd_Write((5<<10)+(5<<4)+(lcd_code[data[4]]&0xf),13);
Lcd_Write((5<<10)+(6<<4)+(lcd_code[data[6]]>>4)+data[7],13);
Lcd_Write((5<<10)+(7<<4)+(lcd_code[data[6]]&0xf),13);
}

void SysTick_Init(void)
{
NVIC_STRVR=0x7a1200;
NVIC_STCSR=5;
}
这是问题的源程序,知道的在此基础上回答完!!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯