⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 panel.c

📁 64输入32输出单片机程序
💻 C
字号:
//-------------------------------------------------------------------------
//	Filename :  Panel.c
//	Language :  C for AT89S8252
//	Revision :  1.0
//  Initial Date :  24/06/2000
//   Last Modify :
//  System clock :  24.00MHZ
//   Description :  Lcd40x4 Display Routine Function For "RS" or "KOREA"
//		    P1 is used display Port: P1.3=EN2 P1.2=EN1 P1.0=RS
//-------------------------------------------------------------------------
#define _PANEL_H_
#include <reg52.h>
#include "Panel.h"
#undef _PANEL_H_
//-------------------------------------------------------------------------
#define  DispPort  P1
#define  KeypadPort  P0
#define  OutputPort	P2
#define BAUD19200   65536-(24000000/(32*19200))
sbit K0 = P0^0;
sbit K1 = P0^1;
sbit K2 = P0^2;
sbit K3 = P0^3;
sbit K4 = P0^4;
sbit K5 = P0^5;
sbit K6 = P0^6;
sbit K7 = P0^7;

//-------------------------------------------------------------------------
#define MSB_PERIOD  -20000/256
#define LSB_PERIOD  -20000%256
//--------------------------------------------------------------------------
unsigned char outp_buf=0xff;
unsigned char key_row_ptr=0;
unsigned char key_ptr;
unsigned char inc_ref;
char manual_buf[4];


//-------------------------------------------------------------------------
// function prototype
void _init_serial(unsigned int);
void _set_display (char, char);
void _res_display (char, char);
void _write_char (char, char);
void _delay5ms (void);
void _delay200us (void);
void _delay100us (void);
void _delay5us (void);
//-------------------------------------------------------------------------
//
//	Routinues for 40x4 LCD Display.
//
//-------------------------------------------------------------------------
void _initial_disp (void)
{
    _res_display(0, 0x30);
    _res_display(1, 0x30);
    _delay5ms();
    _res_display(0, 0x30);
    _res_display(1, 0x30);
    _delay200us();
    _res_display(0, 0x30);
    _res_display(1, 0x30);
    _delay200us();
    _res_display(0, 0x20);
    _res_display(1, 0x20);
    _delay200us();
    _set_display(0, 0x2c);
    _set_display(1, 0x2c);
    _delay200us();
    _set_display(0, 0x0f);
    _set_display(1, 0x0f);
    _delay200us();
    _set_display(0, 0x01);
    _set_display(1, 0x01);
    _delay200us();
    _set_display(0, 0x06);
    _set_display(1, 0x06);
    _delay5ms();
    _set_display(0, 0x0c);
    _set_display(1, 0x0c);
}
//-------------------------------------------------------------------------

void _clear_disp (void)
{
    _set_display(0, 0x01);
    _set_display(1, 0x01);
    _delay5ms();
}
//-------------------------------------------------------------------------
void _cursor_switch (char r,char stus)
{
    switch(r){
	case 0 :
	case 1 :
	    r = 0;
	    break;
	case 2 :
	case 3 :
	    r = 1;
    }
    if (stus == ON )
	_set_display(r, 0x0f);	  // r row ON ,r=0 ,1&2 row r=1 3&4 row
    else
	_set_display(r, 0x0c);	  // r row OFF
}
//-------------------------------------------------------------------------
void _cursor_position (char r, char c)
{
    switch(r){
	case 1 :
	    c += 0x40;
	case 0 :
	    c |= 0x80;
	    _set_display(0,c);
	    break;
	case 3 :
	    c += 0x40;
	case 2 :
	    c |= 0x80;
	    _set_display(1,c);
    }
}
//-------------------------------------------------------------------------
void _disp_msge (char r, char c, char *msge)
{
    char i=0;
    switch(r){
	case 1 :
	    c += 0x40;
	case 0 :
	    _set_display(0, c | 0x80);
	    while (msge[i] != 0)
		_write_char(0, msge[i++]);
	    break;
	case 3 :
	    c += 0x40;
	case 2 :
	    _set_display(1, c | 0x80);
	    while (msge[i] != 0)
		_write_char(1, msge[i++]);
	    break;
    }
}
//-------------------------------------------------------------------------
void _disp_char (char r, char c, char v)
{
    switch (r) {
	case 0 :
	    _set_display(0,0x80+c);
	    r = 0;
	    break;
	case 1 :
	    _set_display(0,0xc0+c);
	    r = 0;
	    break;
	case 2 :
	    _set_display(1,0x80+c);
	    r = 1;
	    break;
	case 3 :
	    _set_display(1,0xc0+c);
	    r = 1;
	    break;
    }
    _write_char(r,(char)('0'+(v/10)));
    _write_char(r,(char)('0'+(v%10)));
}
//-------------------------------------------------------------------------
/* void _write_ascii (char r, char c, char ascii)
{
    switch (r) {
	case 0 :
	    _set_display(0,0x80+c);
	    r = 0;
	    break;
	case 1 :
	    _set_display(0,0xc0+c);
	    r = 0;
	    break;
	case 2 :
	    _set_display(1,0x80+c);
	    r = 1;
	    break;
	case 3 :
	    _set_display(1,0xc0+c);
	    r = 1;
	    break;
    }
    _write_char(r,ascii);
}  */
//-------------------------------------------------------------------------
void _disp_interge (char r, char c, unsigned v)
{
    switch(r){
	case 0 :
	    _set_display(0,0x80+c);
	    r = 0;
	    break;
	case 1 :
	    _set_display(0,0xc0+c);
	    r = 0;
	    break;
	case 2 :
	    _set_display(1,0x80+c);
	    r = 1;
	    break;
	case 3 :
	    _set_display(1,0xc0+c);
	    r = 1;
	    break;
    }

    _write_char(r,(char)('0'+(v/1000)));
    v %= 1000;
    _write_char(r,(char)('0'+(v/100)));
    v %= 100;
    _write_char(r,(char)('0'+(v/10)));
    _write_char(r,(char)('0'+(v%10)));
}
//-------------------------------------------------------------------------
void _disp_float (char r, char c, int v)
{
    switch(r){
	case 0 :
	    _set_display(0,0x80+c);
	    r = 0;
	    break;
	case 1 :
	    _set_display(0,0xc0+c);
	    r = 0;
	    break;
	case 2 :
	    _set_display(1,0x80+c);
	    r = 1;
	    break;
	case 3 :
	    _set_display(1,0xc0+c);
	    r = 1;
	    break;
    }
    if(v>999)
    _write_char(r,(char)('0'+(v/1000)));
    v %= 1000;
    _write_char(r,(char)('0'+(v/100)));
    v %= 100;
    _write_char(r,(char)('0'+(v/10)));
    _write_char(r,'.');
    _write_char(r,(char)('0'+(v%10)));
}
//-------------------------------------------------------------------------
void _disp_win (char *win)
{
    unsigned char i;
    _set_display(0,0x80);
    for (i=0; i<40; i++)
	_write_char(0,win[i]);	 // write char. to row 0 in display.
    _set_display(0,0xc0);
    for (i=40; i<80; i++)
	_write_char(0,win[i]);	 // write char. to row 1 in display.
    _set_display(1,0x80);
    for (i=80; i<120; i++)
	_write_char(1,win[i]);	 // write char. to row 2 in display.
    _set_display(1,0xc0);
    for (i=120; i<160; i++)
	_write_char(1,win[i]);	 // write char. to row 3 in display.
}
//-------------------------------------------------------------------------
void _set_display (char s, char d)
{
    char buf = d;
    switch (s){
	case 0 :
	    buf &= 0xf0;
	    buf |= 0x04;
	    DispPort = buf;
	    DispPort = 0x02;
	    _delay100us();
	    buf = (d<<4)|0x04;
	    DispPort = buf;
	    DispPort = buf & 0x02;     //==0
	    _delay100us();
	    break;
	case 1 :
	    buf &= 0xf0;
	    buf |= 0x08;
	    DispPort = buf;
	    DispPort = 0x02;
	    _delay100us();
	    buf = (d<<4)|0x08;
	    DispPort = buf;
	    DispPort = 0x02;
	    _delay100us();
    }
}
//-------------------------------------------------------------------------
void _res_display (char s, char d)
{
    char buf = d;
    switch (s){
	case 0 :
	    buf &= 0xf0;
	    buf |= 0x04;
	    DispPort = buf;
	    DispPort = 0x02;
	    break;
	case 1 :
	    buf &= 0xf0;
	    buf |= 0x08;
	    DispPort = buf;
	    DispPort = 0x02;
    }
    _delay100us();
}
//-------------------------------------------------------------------------
void _write_char (char s, char c)
{
    char buf = c;
    switch (s) {
	case 0 :
	    buf &= 0xf0;
	    buf |= 0x05;
	    DispPort = buf;
	    DispPort = 0x03;
	    _delay100us();
	    buf = (c<<4)|0x05;
	    DispPort = buf;
	    DispPort = 0x03;
	    _delay100us();
	    break;
	case 1 :
	    buf &= 0xf0;
	    buf |= 0x09;
	    DispPort = buf;
	    DispPort = 0x03;
	    _delay100us();
	    buf = (c<<4)|0x09;
	    DispPort = buf;
	    DispPort = 0x03;
	    _delay100us();
    }
}
//-------------------------------------------------------------------------
void _delay5ms(void)
{
    unsigned tref = 900;
    while (tref != 0)
	tref--;
}
//-------------------------------------------------------------------------
void _delay200us (void)
{
    char tref = 64;
    while (tref--);
}
//-------------------------------------------------------------------------
void _delay100us (void)
{
    char tref = 32;
    while (tref--);
}
//-------------------------------------------------------------------------
/*
void _outp_bit (char f , char s)
{
    switch (f){
	case OFF :
	    if (s == OFF)
		outp_buf |= 00000100;
	    else
		outp_buf &= 11111011;
	    break;
	case PASS :
	    if (s == OFF)
		outp_buf |= 00010000;
	    else
		outp_buf &= 11101111;
	    break;
	case FAIL :
	    if (s == OFF)
		outp_buf |= 00100000;
	    else
		outp_buf &= 11011111;
	    break;
	case AUTO :
	    if (s == OFF)
		outp_buf |= 00000001;
	    else
		outp_buf &= 11111110;
	    break;
	case MANU :
	    if (s == OFF)
		outp_buf |= 00000010;
	    else
		outp_buf &= 11111101;
	    break;
	case TEST :
	    if (s == OFF)
		outp_buf |= 00000100;
	    else
		outp_buf &= 11111011;
	    break;
	case BUZZER :
	    if (s == OFF)
		outp_buf |= 01000000;
	    else
		outp_buf &= 10111111;
    }
    OutputPort = outp_buf;
}
*/
//
-------------------------------------------------------------------------
ar _read_keypad(void)
{
    unsigned char key_val;
    K2=0;
    K0=1;K1=1;K3=1;
    if(K4==0)key_val=F1;
    if(K5==0)key_val=F2;
    if(K6==0)key_val=F3;
    if(K7==0)key_val=F4;

    K3=0;
    K0=1;K1=1;K2=1;
    if(K4==0) key_val=7;
    if(K5==0) key_val=8;
    if(K6==0) key_val=9;
    if(K7==0) key_val=0;

    K0=0;
    K1=1;K2=1;K3=1;
    if(K4==0) key_val=4;
    if(K5==0) key_val=5;
    if(K6==0) key_val=6;
    if(K7==0) key_val=F5;

    K1=0;
    K0=1;K2=1;K3=1;
    if(K4==0) key_val=1;
    if(K5==0) key_val=2;
    if(K6==0) key_val=3;
    if(K7==0) key_val=F6;

    return(key_val);
}


//-------------------------------------------------------------------------
void _set_delay(char delay)
{
    unsigned time;
    time = tick_clock+delay;		// read current time
    while (time != tick_clock);
}
//-------------------------------------------------------------------------
void _init_system(void)
{
    // setup timer0 interrupt initalization
    tick_clock = 0;
    TH0 = MSB_PERIOD;
    TL0 = LSB_PERIOD;
    TMOD |= 0x01;
    TR0 = ON;
    ET0 = ON;
    EA	= ON;
    _init_serial(BAUD19200);
    _initial_disp();
    _set_delay(30);
 }
//-------------------------------------------------------------------------
//	    Timer0 interrupt service function
//	    Executes each 10ms @24MHZ Crystal clock
//-------------------------------------------------------------------------
timer0() interrupt 1 using 2	 // Int Vector at 000BH, Reg Bank 2
{
    TH0 = MSB_PERIOD;
    TL0 = LSB_PERIOD;
    tick_clock++;
    K0=0;K1=0;K2=0;K3=0;
    if(K4==0||K5==0||K6==0||K7==0)
	{
	 key_down = _read_keypad();
	 key_flag=1;
	}
    else
	key_flag=0;

    if (++inc_ref == 10) {
	ref_100ms++;
	inc_ref = OFF;
    }
}
//--------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -