📄 lcd_uart_171.c
字号:
/*
项目:软件串口LCD显示器
芯片:HR7P171F8S1 内部16M
功能:
软件读取串口数据
显示LCD数据码
发送端字符串数据格式
senfm
n,m为高位和低位显示的十进制值对应的字符串
*/
#include <hic.h>
#include "ir.h"
//输入
#define KEY_1 PA1
#define KEY_2 PA0
//输出
#define LED_A PB0 //数码管脚位
#define LED_B PB1
#define LED_C PB2
#define LED_D PB3
#define LED_E PB4
#define LED_F PB5
#define LED_G PB6
#define LED_DP PB7
#define LED_D1 PC0 //数码管共阳极
#define LED_D2 PA7
#define LED_D3 PA6
#define LED_D4 PC1
#define UART_TX PA2 //软件串口输出
#define UART_RX PA4 //软件串口输入
#define LED_ON 1
#define LED_OFF 0
#define UART_LOW 0
#define UART_HIGH 1
#define KEY_PRESS_COUNT 20
#define KEY_DOWN 0
#define KEY_UP 1
uint8 digi_index; //数码管位数值
uint8 single_digi; //每一位数码管显示数值
uint8 delay_count;
uint8 lcd_buf_h;
uint8 lcd_buf_l;
uint8 ucc;
uint8 uci;
uint8 ucb[10];
uint8 ucbi;
uint8 rx_buf;
bool rx_start;
bool rx_valid;
bool rx_buf_end;
uint8 rx_user_flag;
uint8 rx_user_buf[8];
uint8 rx_user_index;
bool tx_end;
uint16 tx_buf;
uint8 key_count1;
uint8 key_count2;
uint8 key_value; //位操作,从低到高,最多8个按键
uint8 key_value_old;
uint8 source_index;
void Clr_Ram_Asm()
{
__asm{
SECTION0
RAM_INI
MOVI 0X20
MOVA IAA
CLR_SECTION0
CLR IAD
INC IAA,1
JBS IAA,7
GOTO CLR_SECTION0
MOVI 0XA0
MOVA IAA
CLR_SECTION1
CLR IAD
INC IAA,1
JBC IAA,7
GOTO CLR_SECTION1
};
}
void Init_Config()
{
OSCC = 0B01110000; //芯片内部晶振频率16M
ACPC = 0x07; //关闭模拟比较器
PAT = 0B00111011;
PBT = 0B00000000;
PCT = 0B11111100;
PA = 0B11000000;
PB = 0B00000000;
PC = 0B00000011;
N_PAPU = 0B11111100;
ADSEL = 0B11111111;
BSET = 0x00;
INTC0 = 0;
T8N = 0;
T8NIF = 0;
T8NIE = 1;
GIE_GIEH = 1;
lcd_buf_h = 0x12;
lcd_buf_l = 0x34;
}
void delay()
{
while(delay_count)
{
__Asm CWDT;
delay_count--;
}
}
void show_lcd()
{
for(digi_index = 0; digi_index < 4; digi_index++)
{
PB = 0xFF;
if(digi_index == 0)
{
LED_D1 = LED_ON;
single_digi = (lcd_buf_h>>4)&0x0F;
}
else if(digi_index == 1)
{
LED_D2 = LED_ON;
single_digi = lcd_buf_h&0x0F;
}
else if(digi_index == 2)
{
LED_D3 = LED_ON;
single_digi = (lcd_buf_l>>4)&0x0F;
}
else if(digi_index == 3)
{
LED_D4 = LED_ON;
single_digi = lcd_buf_l&0x0F;
}
delay_count = 200;
if(single_digi == 0)
{
PB = 0B11000000;
}
else if(single_digi == 1)
{
PB = 0B11111001;
}
else if(single_digi == 2)
{
PB = 0B10100100;
}
else if(single_digi == 3)
{
PB = 0B10110000;
}
else if(single_digi == 4)
{
PB = 0B10011001;
}
else if(single_digi == 5)
{
PB = 0B10010010;
}
else if(single_digi == 6)
{
PB = 0B10000010;
}
else if(single_digi == 7)
{
PB = 0B11111000;
}
else if(single_digi == 8)
{
PB = 0B10000000;
}
else if(single_digi == 9)
{
PB = 0B10010000;
}
else if(single_digi == 10) //A
{
PB = 0B10001000;
}
else if(single_digi == 11) //b
{
PB = 0B10000011;
}
else if(single_digi == 12) //C
{
PB = 0B11000110;
}
else if(single_digi == 13) //d
{
PB = 0B10100001;
}
else if(single_digi == 14) //E
{
PB = 0B10000110;
}
else if(single_digi == 15) //F
{
PB = 0B10001110;
}
delay();
LED_D1 = LED_OFF;
LED_D2 = LED_OFF;
LED_D3 = LED_OFF;
LED_D4 = LED_OFF;
delay_count = 2;
delay();
}
}
void scan_key_down()
{
if(KEY_1 == KEY_DOWN)
{
key_count1++;
if(key_count1 >= KEY_PRESS_COUNT)
{
key_count1 = KEY_PRESS_COUNT;
key_value = 1;
}
}
else
{
key_count1 = 0;
key_value &= 0x0E;
}
if(KEY_2 == KEY_DOWN)
{
key_count2++;
if(key_count2 >= KEY_PRESS_COUNT)
{
key_count2 = KEY_PRESS_COUNT;
key_value = 2;
}
}
else
{
key_count2 = 0;
key_value &= 0x0D;
}
if(key_value_old != key_value)
{
key_value_old = key_value;
if(0x01 == key_value)
{
source_index = 1;
}
else if(0x02 == key_value)
{
source_index = 2;
}
key_value = 0;
}
}
/*
软件模拟串口发送数据
*/
void sw_uart_tx()
{
if(tx_buf)
{
if(tx_buf & 0x0001)
{
UART_TX = 1;
}
else
{
UART_TX = 0;
}
tx_buf >>= 1;
}
else
{
tx_end = 1;
UART_TX = 1;
}
}
/*
开始发送数据
将tx_buf赋值,再调用这个函数
*/
void start_uart_send()
{
if(tx_end == 1)
{
tx_buf <<= 1;
tx_buf |= 0x0200;
tx_end = 0;
}
}
/*
中断定时器里一直调用这个函数
*/
void sw_uart_rx()
{
//读取数据后用户没有读走,将不再接受新的数据
if(rx_buf_end == 1)
return;
if(UART_RX == UART_LOW)
{
if(rx_start == 0) //第1个低电平开始
{
rx_start = 1;
uci = 0;
}
if(rx_start == 1)
{
if(ucc < 9)
{
ucb[uci] = (0x00|(ucb[uci]>>1));
}
if(ucc == 8)
{
ucc = 0;
uci++;
}
ucc++;
}
}
else
{
if(rx_start == 1)
{
if(ucc < 9)
{
ucb[uci] = (0x80|(ucb[uci]>>1));
}
if(ucc == 8)
{
ucc = 0;
uci++;
}
ucc++;
}
}
if(rx_start)
{
if(rx_valid)
{
if(uci == 9)
{
rx_start = 0;
rx_buf = 0;
for(ucbi = 1; ucbi < 9; ucbi++)
{
if((ucb[ucbi]&0x18) == 0x18)
{
rx_buf = 0x80|(rx_buf>>1);
}
else
{
rx_buf = 0x00|(rx_buf>>1);
}
ucb[ucbi] = 0;
}
rx_buf_end = 1;
}
}
else
{
if(uci == 1)
{
if((((ucb[0]|0xE7)&0xff) == 0xE7))
{
rx_valid = 1;
}
else
{
rx_start = 0;
}
}
}
}
}
void isr() interrupt
{
//T8中断处理程序
if(T8NIE&&T8NIF)
{
T8NIF = 0;
T8N += 60; //16M 50:105us
//解码NEC红外遥控码
ir_decode();
//接受1200bps 8倍采样数据
sw_uart_rx();
//发送串口数据
if(tx_end == 0)
sw_uart_tx();
}
}
void main()
{
Clr_Ram_Asm(); //清RAM
__Asm CWDT;
Init_Config();
while(1)
{
__Asm CWDT;
scan_key_down();
if(source_index == 0) //显示串口发来的数据
{
if(rx_buf_end == 1)
{
rx_buf_end = 0;
rx_user_buf[rx_user_index] = rx_buf;
rx_user_index++;
if(rx_buf == 115) //'s'
{
rx_user_index = 0;
}
}
if(rx_user_index >= 4)
{
rx_user_index = 0;
if(rx_user_buf[0] == 101) //'e'
{
lcd_buf_h = rx_user_buf[1];
if(lcd_buf_h>100)
{
lcd_buf_h = lcd_buf_h - (lcd_buf_h/100)*100;
}
}
if(rx_user_buf[2] == 102) //'f'
{
lcd_buf_l = rx_user_buf[3];
if(lcd_buf_l>100)
{
lcd_buf_l = lcd_buf_l - (lcd_buf_l/100)*100;
}
}
}
}
else if(source_index == 1)
{
if(ir_valid == 1)
{
ir_valid = 0;
lcd_buf_h = addrh;
lcd_buf_l = addrl;
}
}
else if(source_index == 2)
{
if(ir_valid == 1)
{
ir_valid = 0;
lcd_buf_h = ir_keycode1;
lcd_buf_l = ir_keycode2;
}
}
show_lcd();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -