這次参加的人很多,照片是大家都去用餐時拍的所以沒人, 我個人對上圖"觸控"很有興趣,
它是把原先要做在pcb上的銅箔,改做在HTN的玻璃上,看起來很簡潔
// Date:2008_11_15
#include "REG_MPC82G516.h"
#include "INTRINS.H"
// io port Description
#define _ONE P24
#define _TWO P27
#define _THREE P26
#define _FOUR P25
#define BIBI P20
#define BARUBO P16
#define SCL P11
#define SDA P12
//const
unsigned int temp,temp_0,read_code0,read_code1,read_code2,temp_data;
_7_seg[12]={0x09,0xED,0x2A,0x68,0xCC,0x58,0x18,0xC9,0x08,0xC8,0xff,0xfe};
int time_cnt,sec_cnt;
unsigned char _1_sec_cnt=0x14 ;
unsigned char scan_cnt=0X00 ;
unsigned char disp_0,disp_1,disp_2,disp_3 ;
unsigned char disp_10,disp_11,disp_12,disp_13 ;
bit on_flag,eeprom_err;
unsigned char TCN75A_rd_cmd=0x91 ;
unsigned char TCN75A_wr_cmd=0x90 ;
unsigned char addre_0=0x00 ;
// ----------------------------------------------
void LCD_S_Delay(void)
{
int S_Loop ;
int Null_Var ;
for ( S_Loop = 0 ; S_Loop < 200 ; S_Loop ++ )
Null_Var += 1 ;
}
// ----------------------------------------------
void LCD_L_Delay(int WAIT_LOOP)
{
int L_Loop ;
for ( L_Loop = 0 ; L_Loop < WAIT_LOOP ; L_Loop ++ )
LCD_S_Delay( ) ;
}
void Init_IRQ()
{
// ET0 = 0x01; //Enable Timer Interrupt 0
ET1 = 0x01; //Enable Timer Interrupt 1
ET2 = 0x01; //Enable Timer Interrupt 2
TMOD = 0X10 ;
TH1 = 0X3C ;
TL1 = 0XB0 ;
T2CON = 0X00 ;
RCAP2H = 0XFA ;
RCAP2L = 0X00 ;
EA = 0x01 ; //Enable All Interrupt
TR1 = 0X01 ; //START TIMER1
T2CON |= 0X04 ; //START TIMER2
}
void Timer_Interrupt_1() interrupt 3
{
_1_sec_cnt -- ;
if (_1_sec_cnt==0)
{ time_cnt ++ ;
_1_sec_cnt=0x14 ;}
if (time_cnt>=60)
{sec_cnt+=1;
time_cnt=0; }
// BIBI = !BIBI ;
TH1 = 0X3C ;
TL1 = 0XB0 ;
}
void Timer_Interrupt_2() interrupt 5
{
T2CON &= 0X7F; //CLEAR TIMER2 INT_FLAG
// BIBI = !BIBI ;
if (scan_cnt>3) scan_cnt=0x00;
// �� switch �N�i���������ҭn���檺����,�B���槹,���Wbreak���X
// �M�� if �����㤣�P ���`�N
switch(scan_cnt)
{case 0:
P0=0XFF;
_ONE=0x00;
_TWO=0x01;
_THREE=0X01;
_FOUR=0X01;
P0= _7_seg[disp_0] ;
scan_cnt ++ ;
break;
case 1:
P0=0XFF;
_ONE=0x01;
_TWO=0x00;
_THREE=0X01;
_FOUR=0X01;
P0= _7_seg[disp_1] ;
scan_cnt ++ ;
break;
case 2:
P0=0XFF;
_ONE=0x01;
_TWO=0x01;
_THREE=0X00;
_FOUR=0X01;
P0= _7_seg[disp_2] ;
scan_cnt ++ ;
break;
case 3:
P0=0XFF;
_ONE=0x01;
_TWO=0x01;
_THREE=0X01;
_FOUR=0X00;
// P0= _7_seg[disp_3] ;
if (on_flag==1)
P0= _7_seg[10] ;
else P0= _7_seg[11] ;
scan_cnt ++ ;
break;
}
}
void read_tcn75a_2_byte (void)
{
//--- START BIT
SDA=0X01;SCL=0X01;
LCD_S_Delay();
SDA=0X00;
LCD_S_Delay();
SCL=0X00;
LCD_S_Delay();
//-----WRITE CAMMAND CODE 0XA0------
if ( (TCN75A_wr_cmd&0x80) == 0x80 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_wr_cmd&0x40) == 0x40 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_wr_cmd&0x20) == 0x20 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_wr_cmd&0x10) == 0x10 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_wr_cmd&0x08) == 0x08 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_wr_cmd&0x04) == 0x04 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_wr_cmd&0x02) == 0x02 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_wr_cmd&0x01) == 0x01 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
_nop_();
SDA=0x01;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0X01) eeprom_err=0x01;
else eeprom_err=0x00;
SCL=0x00;
_nop_();
//-----WRITE address------
if ( (addre_0&0x80) == 0x80 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (addre_0&0x40) == 0x40 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (addre_0&0x20) == 0x20 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (addre_0&0x10) == 0x10 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (addre_0&0x08) == 0x08 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (addre_0&0x04) == 0x04 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (addre_0&0x02) == 0x02 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (addre_0&0x01) == 0x01 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
//------------
_nop_();
SDA=0x01;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0X01) eeprom_err=0x01;
else eeprom_err=0x00;
SCL=0x00;
_nop_();
LCD_S_Delay();
// ------ re_start
//--- START BIT
SDA=0X01;SCL=0X01;
LCD_S_Delay();
SDA=0X00;
LCD_S_Delay();
SCL=0X00;
LCD_S_Delay();
//-----WRITE CAMMAND CODE 0XA1------
if ( (TCN75A_rd_cmd&0x80) == 0x80 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_rd_cmd&0x40) == 0x40 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_rd_cmd&0x20) == 0x20 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_rd_cmd&0x10) == 0x10 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_rd_cmd&0x08) == 0x08 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_rd_cmd&0x04) == 0x04 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_rd_cmd&0x02) == 0x02 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
if ( (TCN75A_rd_cmd&0x01) == 0x01 ) SDA=0x01;
else SDA=0x00;
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
_nop_();
SDA=0x01;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0X01) eeprom_err=0x01;
else eeprom_err=0x00;
SCL=0x00;
_nop_();
//----- read data
read_code0=0x00;
SDA=0x01;
_nop_();
_nop_();
_nop_();
_nop_();
// SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code0=read_code0|0X80;
else read_code0=read_code0&0x7f;
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
LCD_S_Delay();
LCD_L_Delay(38);
// SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code0=read_code0|0X40;
else read_code0=read_code0&0xbf;
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
LCD_S_Delay();
LCD_L_Delay(38);
// SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code0=read_code0|0X20;
else read_code0=read_code0&0xdf;
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
LCD_S_Delay();
LCD_L_Delay(38);
// SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code0=read_code0|0X10;
else read_code0=read_code0&0xef;
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
LCD_S_Delay();
LCD_L_Delay(38);
// SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code0=read_code0|0X08;
else read_code0=read_code0&0xf7;
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
LCD_S_Delay();
LCD_L_Delay(38);
// SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code0=read_code0|0X04;
else read_code0=read_code0&0xfb;
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
LCD_S_Delay();
LCD_L_Delay(38);
// SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code0=read_code0|0X02;
else read_code0=read_code0&0xfd;
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
LCD_S_Delay();
LCD_L_Delay(38);
// SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code0=read_code0|0X01;
else read_code0=read_code0&0xfe;
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
//ack
SDA=0x00; // master ack
// SCL=0x00;
LCD_S_Delay();
// if (SDA==0X01) eeprom_err=0x01;
// else eeprom_err=0x00;
SCL=0x01;
LCD_L_Delay(38);
SCL=0x00;
LCD_L_Delay(8);
SDA=0x01;
// next byte
read_code1=0x00;
SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code1=read_code1|0X80;
else read_code1=read_code1&0x7f;
SCL=0x00;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code1=read_code1|0X40;
else read_code1=read_code1&0xbf;
SCL=0x00;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code1=read_code1|0X20;
else read_code1=read_code1&0xdf;
SCL=0x00;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code1=read_code1|0X10;
else read_code1=read_code1&0xef;
SCL=0x00;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code1=read_code1|0X08;
else read_code1=read_code1&0xf7;
SCL=0x00;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code1=read_code1|0X04;
else read_code1=read_code1&0xfb;
SCL=0x00;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code1=read_code1|0X02;
else read_code1=read_code1&0xfd;
SCL=0x00;
LCD_S_Delay();
SCL=0x01;
LCD_S_Delay();
if (SDA==0x01) read_code1=read_code1|0X01;
else read_code1=read_code1&0xfe;
SCL=0x00;
LCD_S_Delay();
read_code2 = read_code1;
// --- NAK
SDA=0x01;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SCL=0x00;
//------ stop bit
SDA=0x00;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0x01;
LCD_S_Delay();
SDA=0x01;
LCD_S_Delay();
//-----------------
read_code1 = read_code1&0x80;
// read_code1 = read_code1>>7;
read_code0 = read_code0<<1;
if (read_code1==0x80) {temp_data = read_code0 + 0x01 ;}
else {temp_data = read_code0 ;}
// temp_data = read_code1 | read_code0 ;
// read_code2 = read_code1;
disp_10 = temp_data % 10 ;
disp_11 = (temp_data/10)%10 ;
disp_12 = (temp_data%1000)/100 ;
temp=(temp_data*10)/2;
disp_10 = temp % 10 ;
disp_11 = (temp/10)%10 ;
disp_12 = (temp%1000)/100 ;
// disp_13 = temp_data / 1000 ;
temp=((disp_12*100+disp_11*10+disp_10)*10);
temp_0=(temp*10);
disp_10 = temp_0 % 10 ;
disp_11 = (temp_0/10)%10 ;
disp_12 = (temp_0%1000)/100 ;
disp_3 = temp_0 / 1000 ;
}
void Main(void)
{
SDA=0x01;
read_tcn75a_2_byte ( );
// Init_IRQ();
BARUBO=0X01; //BARUBO OFF
while (1)
{
LCD_L_Delay(30);
read_tcn75a_2_byte ( );
//
}
}
MPC82G516, 82E54是台灣笙泉的8x51MCU,一直以來我都用它來作老闆要的東西
我覺得很好用喔
#include "REG_MPC82G516.h" //for MPC82G516 SFR definition
//雖是選MPC82G516但是實上,ic是82E54
#include "INTRINS.H" //
unsigned char COMM;
unsigned char Data_1,Data_2;
sbit LCD_E = P3^7 ;
sbit LCD_RS = P3^4 ;
sbit LCD_RW = P3^5 ;
// ***********************************************
void LCD_S_Delay(void)
{
int S_Loop ;
int Null_Var ;
for ( S_Loop = 0 ; S_Loop < 200 ; S_Loop ++ )
Null_Var += 1 ;
}
// **********************************************
void LCD_L_Delay(void)
{
int L_Loop ;
for ( L_Loop = 0 ; L_Loop < 100 ; L_Loop ++ )
LCD_S_Delay( ) ;
}
//***********************************************
// Subroutine to
// Write a command to LCD module
// RS=0, R/W=0, E=H->L F(alling Edge)
// 寫入指令到lcd
void LCD_CMD_W_Timing( void )
{
LCD_RS = 0 ; // Set for Command Input
_nop_();
LCD_RW = 0 ;
_nop_();
LCD_E = 1 ;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E = 0 ;
}
//***********************************************
// Subroutine to
// Write a command to LCD module
// RS=1, R/W=0, E=H->L F(alling Edge)
// 寫入資料到lcd
void LCD_DAT_W_Timing( void )
{ LCD_RS = 1 ; // Set for Data Input
_nop_();
LCD_RW = 0 ;
_nop_();
LCD_E = 1 ;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E = 0 ;
}
LCD_RESET(void) // 初始化lcd(16*02)
{
P3 = 0x03;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
P3 = 0x03;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
//-----------------------------------------------
P3 = 0x03;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x02;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//-------------------------------------------------
P3=0x01;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x04;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//--------------------------------------------------
P3=0x00;
LCD_CMD_W_Timing() ;
// LCD Function SET
LCD_L_Delay() ;
P3=0x0f;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//-----------------------------------------------------
P3=0x00;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x02;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//-------------------------------------------------------
P3=0x00;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x01;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
//-----------------------------------------------
P3=0x08;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x02;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
}
unsigned int Get_ADC_Channel(char channel)
{ // 82e54一共有8個通道10bit的A TO D
channel &= 0x07 //make sure channel is 0-7
ADCTL = 0x88channel; //start convert
while(!(ADCTL & 0x10)){} //check if convert done
return ((unsigned int)(ADCH<<2) (ADCL & 3));
}
void Output(unsigned char d)
{ // 將所讀到的ad值 轉成ascII 且輸出到lcd
if(d>9 & d<16) Data_1 = (d + 0x37);
else if(d<10) Data_1 = (d + 0x30);
Data_2 = Data_1;
//因為lcd控制是採4bit控制 所以一個byte要送兩次
P3=Data_2>>4;
LCD_DAT_W_Timing();
LCD_S_Delay( );
P3=Data_1&0X0F;
LCD_DAT_W_Timing();
LCD_S_Delay( );
}
main(void)
{
unsigned int VALUE;
P3=0XFF;
LCD_L_Delay() ;
P1M0=0X0F; // P1 IS ALL INPUT
P1M1=0X00; //
LCD_RESET();
P3=0x08;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x00;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
while (1)
{
VALUE=Get_ADC_Channel(7);
Output(VALUE>>8); //顯示最高 nibble
Output((VALUE>>4)&0x0f); //顯示中間 nibble
Output(VALUE&0x0f); //顯示最低 nibble
P3=0x08;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
P3=0x00;
LCD_CMD_W_Timing() ; // LCD Function SET
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
LCD_L_Delay() ;
}
}