📄 main.c
字号:
//#include <STC89.h>
#include <reg52.h>
#include <intrins.h>
#include "mcu.h"
#include "kaixin.h"
#include "ascii.h"
#define VopADD 3 //Vlcd 增加
#define VopSUB 4 //Vlcd 减少
#define DispDN 1 //画面向下翻
#define DispUP 2 //画面向上翻
//定义与 ADC 有关的特殊功能寄存器
sfr P1_ADC_EN = 0x97; // A/D 转换功能允许寄存器
sfr ADC_CONTR = 0xC5; // A/D 转换控制寄存器
sfr ADC_DATA = 0xC6; // A/D 转换结果寄存器
sbit LCD_CS1 =P3^3; //sbit 数据类型 值域 0/1
sbit LCD_RST =P3^4;
sbit LCD_RS1 =P3^5;
sbit LCD_WR1 =P3^6;
sbit LCD_RD1 =P3^7;
//#define DATAL P1
#define lcd_data P0
unsigned char contrst=0x31;
void delay_us(char us_value);
void delay_ms(unsigned int ms_value);
void init_RS232 (void);
void Send_Byte(char one_byte);
unsigned char get_AD_result(unsigned char channel);
unsigned char key_dowith(void);
void init_cpu(void);
void init_lcd(void);
void wr_cmd(unsigned char wrcmd);
void wr_data(unsigned char wrdata);
void disp_all(unsigned char value);
void disp_check(unsigned char value);
void disp_bmp(char *bmp);
//-----------------------------------------------------------------------------
//=============================================================================
//-----------------------------------------------------------------------------
void init_RS232 (void) // 串口初始化
{
ES = 0; // 禁止串口中断
SCON = 0x50; // 0101,0000 8位数据位, 无奇偶校验
T2CON = 0x34; // 0011,0100, 由T2作为波特率发生器
RCAP2H = 0xFF; // 时钟11.0592MHz, 9600 波特率
RCAP2L = 0xDB;
ES = 1; // 允许串口中断
}
//-----------------------------------------------------------------------------
void Send_Byte(char one_byte) // 发送一个字节
{
TI = 0; // 清零串口发送中断标志
SBUF = one_byte;
while (TI == 0);
TI = 0; // 清零串口发送中断标志
}
//-----------------------------------------------------------------------------
unsigned char get_AD_result(unsigned char channel)
{
unsigned char AD_finished = 0; // 存储 A/D 转换标志
ADC_DATA = 0;
ADC_CONTR = channel; //选择 A/D 当前通道
delay_us(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADC_START = 1, 启动A/D转换
AD_finished = 0;
while ( AD_finished == 0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1 测试A/D转换结束否
}
ADC_CONTR &= 0xF7; //1111,0111 令 ADC_START = 0, 关闭A/D转换,
return (ADC_DATA); // 返回 A/D 转换结果
}
//-----------------------------------------------------------------------------
unsigned char key_dowith(void)
{
unsigned char value;
value = get_AD_result(3);
//Send_Byte(value);
if((value<0xec)&&(value>0xe8)) return 1;
else if((value<0xe2)&&(value>0xdd)) return 2;
else if((value<0xc7)&&(value>0xc0)) return 3;
else if(value<0x10) return 4;
else return 0;
}
//=============================================================================
void delay_us(char us_value) //delay about 1 us
{
while(us_value--)
{
_nop_();
_nop_();
_nop_();
}
}
//-----------------------------------------------------------------------------
void delay_ms(unsigned int ms_value) //delay about 1 ms
{
unsigned int k;
for(k=0;k<ms_value;k++)
{
delay_us(200);
}
}
//-----------------------------------------------------------------------------
void init_cpu() //Initial 89C52
{
delay_ms(5);
lcd_data=0x00;
LCD_RST = 0;
LCD_CS1 = 1;
LCD_RS1 = 0;
LCD_WR1 = 1;
LCD_RD1 = 1;
delay_ms(5);
LCD_RST = 1;
delay_ms(50);
}
//-----------------------------------------------------------------------------
void wr_cmd(unsigned char wrcmd)
{
LCD_RS1 = 0; //select instruction
LCD_CS1 = 0;
lcd_data=wrcmd;
LCD_WR1 = 0;
//delay_us(1);
LCD_WR1 = 1;
//delay_us(1);
LCD_CS1 = 1;
//delay_us(1);
}
//-----------------------------------------------------------------------------
void wr_data(unsigned char wrdata)
{
LCD_RS1 = 1; //select instruction
LCD_CS1 = 0;
lcd_data=wrdata;
LCD_WR1 = 0;
//delay_us(1);
LCD_WR1 = 1;
//delay_us(1);
LCD_CS1 = 1;
//delay_us(1);
}
//-----------------------------------------------------------------------------
void init_lcd(void)
{
wr_cmd(0xa4); //EON=0,normal display
wr_cmd(0xa6); //REV=0,normal display
wr_cmd(0xa0); //ADC=0,SEG0->SEG131
wr_cmd(0x40); //Initial display line for COM0
wr_cmd(0xc8); //SHL select,COM63->COM0
delay_us(1);
wr_cmd(0x81); //SET Register
wr_cmd(contrst);
delay_us(1);
wr_cmd(0xa3); //SET BIAS
delay_us(1);
wr_cmd(0x2f);
delay_ms(1);
wr_cmd(0xaf); //dispaly on
delay_ms(1);
}
//-----------------------------------------------------------------------------
void disp_all(unsigned char value)
{
unsigned char ii,jj;
for(ii=0;ii<8;ii++)
{
wr_cmd(0xb0+ii);
wr_cmd(0x10);
wr_cmd(0x00);
for(jj=0;jj<128;jj++)
wr_data(value);
}
}
//-----------------------------------------------------------------------------
void disp_check(unsigned char value)
{
unsigned char ii,jj;
for(ii=0;ii<8;ii++)
{
wr_cmd(0xb0+ii);
wr_cmd(0x10);
wr_cmd(0x00);
for(jj=0;jj<64;jj++)
{
wr_data(value);
wr_data(~value);
}
}
}
//----------------------------------------------------------------------------------
void disp_bmp(char *bmp)
{
unsigned char ii,jj;
for(ii=0;ii<8;ii++)
{
wr_cmd(0xb0+ii);
wr_cmd(0x10);
wr_cmd(0x00);
for(jj=0;jj<128;jj++) wr_data(bmp[ii*128+jj]);
}
}
//-----------------------------------------------------------------------------
void show_contrst()
{
unsigned char nn;
unsigned char tmph,tmpl;
tmph=contrst/10;
tmpl=contrst%10;
wr_cmd(0xb0);
wr_cmd(0x10);
wr_cmd(0x02);
for(nn=0;nn<6;nn++)
wr_data(num[tmph*6+nn]);
for(nn=0;nn<6;nn++)
wr_data(num[tmpl*6+nn]);
delay_ms(200);
}
//----------------------------------------------------------------------------------
#define bmpMAX 5
void main(void)
{
unsigned char dispID,dispIP;
unsigned char keyValue;
init_cpu();
init_lcd();
init_RS232();
//disp_bmp(mcu);
dispID = 0;
dispIP = 1;
while(1)
{
keyValue = key_dowith();
if(keyValue>0)
{
switch(keyValue)
{
case DispDN:
if(dispID<bmpMAX) dispID++;
else dispID = 0;
dispIP = 1;
break;
case DispUP:
if(dispID>1) dispID--;
else dispID = bmpMAX;
dispIP = 1;
break;
case VopADD:
if(contrst<63) contrst++;
wr_cmd(0x81);
wr_cmd(contrst);
delay_us(2);
show_contrst();
break;
case VopSUB:
if(contrst>0) contrst--;
wr_cmd(0x81);
wr_cmd(contrst);
delay_us(2);
show_contrst();
break;
default: break;
}
}
//Send_Byte(key_dowith());
//delay_ms(1000);
if(dispIP)
{
dispIP = 0;
switch(dispID)
{
case 0: disp_bmp(mcu); break;
case 1: disp_bmp(kaixin); break;
case 2: disp_all(0xff); break;
case 3: disp_all(0x00); break;
case 4: disp_check(0xAA); break;
case 5: disp_check(0x55); break;
default: break;
}
delay_ms(300);
}
}
}
//----------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -