📄 lcd.c
字号:
#include <includes.h>
/*
// LCD段码表(可自定义扩充,参考原理电路图)
显示字符(十进制表示) a b c d e f g dp 段码值(十六进制)
-----------------------------------------------
0 1 1 1 1 1 1 0 0 0x3F
1 0 0 0 0 1 1 0 0 0x30
2 1 1 0 1 1 0 1 0 0x5B
3 1 1 1 1 0 0 1 0 0x4F
4 0 1 1 0 0 1 1 0 0x66
5 1 0 1 1 0 1 1 0 0x6D
6 1 0 1 1 1 1 1 0 0x7D
7 1 1 1 0 0 0 0 0 0x07
8 1 1 1 1 1 1 1 0 0x7F
9 1 1 1 1 0 1 1 0 0x6F
. 0 0 0 0 0 0 0 1 0x80
-----------------------------------------------
*/
unsigned char dataSeg[11] = {0x3F,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80};
_sn74hc138_status sn74hc138_statusTable[8];
/* sn74hc138真值表定义 与LED,LCD电路相关 */
void SetSn74hc138StatusTable(void);
void Set74hc595Output(unsigned char data); // 设置74HC595的并行输出值
void LcdInitlize(void); // LCD初始化设置
void LcdClear(void); // LCD清屏
void TaskLcd(void *p_arg)
{
int i, j;
p_arg = p_arg;
AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);
LcdInitlize();
while(1)
{
for( j = 0; j < 8; j++) // 依次选通LCD
{
if( sn74hc138_statusTable[j].nPfLow != NONE ) AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, sn74hc138_statusTable[j].nPfLow);
if( sn74hc138_statusTable[j].nPfHigh != NONE ) AT91F_PIO_SetOutput(AT91C_BASE_PIOA, sn74hc138_statusTable[j].nPfHigh);
for( i = 0; i < 11; i++) // 对选通的LCD,依次显示段表中的所有段值
{
Set74hc595Output(dataSeg[i]);
OSTimeDlyHMSM(0, 0, 0, 100);
}
}
for( i = 0; i < 11; i++) // 依次选择段值
{
Set74hc595Output(dataSeg[i]);
for( j = 0; j < 8; j++) // 对选定的段值,依次选通LCD
{
if( sn74hc138_statusTable[j].nPfLow != NONE ) AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, sn74hc138_statusTable[j].nPfLow);
if( sn74hc138_statusTable[j].nPfHigh != NONE ) AT91F_PIO_SetOutput(AT91C_BASE_PIOA, sn74hc138_statusTable[j].nPfHigh);
OSTimeDlyHMSM(0, 0, 0, 100);
}
}
LcdClear();
OSTimeDlyHMSM(0, 0, 2, 0);
}
}
/*
描 述:74HC595输出指定字节
参数说明:byte data -- 指定输出的字节
*/
void Set74hc595Output(unsigned char data)
{
int i;
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCD_74HC595_RCLK);
for( i=0; i<8; i++)
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCD_74HC595_SRCLK);
(data&0x80) == 0x00 ? AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCD_74HC595_SER) : AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_74HC595_SER);
data = data << 1;
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_74HC595_SRCLK);
}
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_74HC595_RCLK); // 改变时序,并行输出
}
void LcdInitlize(void)
{
// 设置PMC、PIO
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LCD_74HC138_A_PA31|LCD_74HC138_B_PA2|LCD_74HC138_C_PA30) ;
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LCD_74HC595_RCLK|LCD_74HC595_SRCLK|LCD_74HC595_SER) ;
// LCD清屏,设置74HC138真值表
LcdClear();
SetSn74hc138StatusTable();
}
void LcdClear(void)
{
Set74hc595Output(0x0);
}
void SetSn74hc138StatusTable(void)
{
sn74hc138_statusTable[0].nPfLow = LCD_74HC138_A_PA31|LCD_74HC138_B_PA2|LCD_74HC138_C_PA30;
sn74hc138_statusTable[0].nPfHigh = NONE;
sn74hc138_statusTable[1].nPfLow = LCD_74HC138_B_PA2|LCD_74HC138_C_PA30;
sn74hc138_statusTable[1].nPfHigh = LCD_74HC138_A_PA31;
sn74hc138_statusTable[2].nPfLow = LCD_74HC138_A_PA31|LCD_74HC138_C_PA30;
sn74hc138_statusTable[2].nPfHigh = LCD_74HC138_B_PA2;
sn74hc138_statusTable[3].nPfLow = LCD_74HC138_C_PA30;
sn74hc138_statusTable[3].nPfHigh = LCD_74HC138_A_PA31|LCD_74HC138_B_PA2;
sn74hc138_statusTable[4].nPfLow = LCD_74HC138_A_PA31|LCD_74HC138_B_PA2;
sn74hc138_statusTable[4].nPfHigh = LCD_74HC138_C_PA30;
sn74hc138_statusTable[5].nPfLow = LCD_74HC138_B_PA2;
sn74hc138_statusTable[5].nPfHigh = LCD_74HC138_A_PA31|LCD_74HC138_C_PA30;
sn74hc138_statusTable[6].nPfLow = LCD_74HC138_A_PA31;
sn74hc138_statusTable[6].nPfHigh = LCD_74HC138_B_PA2|LCD_74HC138_C_PA30;
sn74hc138_statusTable[7].nPfLow = NONE;
sn74hc138_statusTable[7].nPfHigh = LCD_74HC138_A_PA31|LCD_74HC138_B_PA2|LCD_74HC138_C_PA30;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -