今天刚刚写的一个程序,使用HT1621驱动LCD显示,通过控制WR端口到低电平,使得LCD模块得到要显示什么的数据,为何只显示了第一次的数据,让他接着清屏或者数字全部显示,或者显示下一个数据时他就不会变了,为什么?代码如下:
main.c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HT1621_Init();
// HT1621_Display();
while (1)
{
HT1621_Display();
HAL_Delay(2000);
HAL_Delay(2000);
HT1621_Test();
//HT1621_Test();
HT1621_Display2();
//HT1621_Test();
}
}
//基本命令
#define OSC_OFF 0x00 // 关闭震荡器
#define OSC_ON 0x01 // 开启震荡器
#define DISP_OFF 0x02 // 关LCD Bias
#define DISP_ON 0x03 // 开LCD Bias
#define COM_1_3__4 0x29 // 1/3bias 4com
#define COM_1_3__3 0x25 // 1/3bias 3com
#define COM_1_3__2 0x21 // 1/3bias 2com
#define COM_1_2__4 0x28 // 1/2bias 4com
#define COM_1_2__3 0x24 // 1/2bias 3com
#define COM_1_2__2 0x20 // 1/2bias 2com
//扩展命令,该功能未引出关闭可降低功耗
#define TIMER_DIS 0x04 // 不使 time base 輸出
#define WDT_DIS 0x05 // 不使 WDT 暫停旗標輸出
#define BUZZ_OFF 0x08 // 关闭蜂鸣器
#define RC32K 0X18 //
#define IRQ_DIS 0X80 // 不使 IRQ 輸出
void HT1621_Init()//初始化
{
HT1621_CS_H();
HT1621_WR_H();
HT1621_DATA_H();
WriteCommandHT1621(OSC_ON);
WriteCommandHT1621(DISP_ON);
WriteCommandHT1621(TIMER_DIS);
WriteCommandHT1621(WDT_DIS);
WriteCommandHT1621(BUZZ_OFF);
//WriteCommandHT1621(IRQ_DIS);
HT1621_num_init(); //自动生成液晶屏需要的数组
}
void WriteClockHT1621(void)
{
HT1621_WR_L();
delay_us(20);
HT1621_WR_H();
delay_us(20);
}
void Write1DataHT1621(unsigned char Addr,unsigned char Dat)//X写数据函数
{
unsigned char i;
unsigned char Shift;
HT1621_CS_L(); //CS 片选开
delay_us(20);
HT1621_DATA_H(); //101
WriteClockHT1621();
HT1621_DATA_L();
WriteClockHT1621();
HT1621_DATA_H();
WriteClockHT1621();
Shift = 0x20; //屏蔽高3位 只用5位
for( i = 0; i < HT1621_addrbit; i++) //RAM地址
{
if(Addr & Shift)//写数码管 一个数字组成
{
HT1621_DATA_H();
}
else
{
HT1621_DATA_L();
}
WriteClockHT1621();
Shift = Shift >> 1;
}
Shift = 0x01;
for (i = 0; i < 4; i++)//第几个数亮
{
if( Dat & Shift)
{
HT1621_DATA_H();
}
else
{
HT1621_DATA_L();
}
WriteClockHT1621();
Shift = Shift << 1;
}
HT1621_CS_H(); //CS 片选关
delay_us(20);
HT1621_DATA_H();
}
void HT1621_Display(void)//发送要写一个1234的数据
{
unsigned int Temp=1234;
unsigned char Temp_Data;
Temp_Data = Temp / 1000;//1
Write1DataHT1621(HT1621_segtab[0], LCD_RAM_Tab[Temp_Data]>>4);
Write1DataHT1621(HT1621_segtab[1], LCD_RAM_Tab[Temp_Data]>>0);
Temp_Data = Temp % 1000 / 100;//2
Write1DataHT1621(HT1621_segtab[2], LCD_RAM_Tab[Temp_Data]>>4);
Write1DataHT1621(HT1621_segtab[3], LCD_RAM_Tab[Temp_Data]>>0);
Temp_Data = Temp % 1000 % 100 / 10;//3
Write1DataHT1621(HT1621_segtab[4], LCD_RAM_Tab[Temp_Data]>>4);
Write1DataHT1621(HT1621_segtab[5], LCD_RAM_Tab[Temp_Data]>>0);
Temp_Data = Temp % 1000 % 100 % 10;//4
Write1DataHT1621(HT1621_segtab[6], LCD_RAM_Tab[Temp_Data]>>4);
Write1DataHT1621(HT1621_segtab[7], LCD_RAM_Tab[Temp_Data]>>0);
}