?? avr單片機的嵌入式開發-照片顯影機控制及顯示程序.c
字號:
/*****************************************************
ICC-AVR application builder : 2006-1-8 14:49:27
膠片擴印機電機控制程序(ICCAVR6.31)
email:suming8341@163.com
Target : M128
Crystal: 8.0000Mhz
*****************************************************/
#include <iom128v.h>
#include <slavr.h>
#include <macros.h>
//各鍵管腳定義
//啟動鍵PD.6
#define start_key (PIND&0x40)
//清零鍵PD.7
#define cls_key (PIND&0x80)
//PC.7~PC.2電機步數調整鍵
#define mt1_up (PINC&0x80)
#define mt1_down (PINC&0x40)
#define mt2_up (PINC&0x20)
#define mt2_down (PINC&0x10)
#define mt3_up (PINC&0x08)
#define mt3_down (PINC&0x04)
unsigned char mt3_adsb=0;
unsigned int mt3_count=2500;//計數1初值,200hz啟動,中斷中改到250,2k hz
unsigned int mt2_count=125;//計數器0初值,2khz
// #define steps2_ready 140
//unsigned int mt2_count=156 ;//計數0初值,200hz啟動中斷中改到2k hz,如用過渡須改分頻值
//曝光結束信號PC.1
#define end_ack (PINC&0x02)
//電機2方向信號控制腳PORTB.0
#define set_dir2 asm("sbi 0x18,2")
#define clr_dir2 asm("cbi 0x18,2")
///////////////////////////////////////////////////////
/*紙張尺寸選擇
按鍵引腳:
5寸——PE2
6寸---PE3
7寸---PE4
8寸---PE5*/
#define s5 (PINE&0x04)
#define s6 (PINE&0x08)
#define s7 (PINE&0x10)
#define s8 (PINE&0x20)
////////////////////////////////////////////////////
//密度設定值按鍵PD.4,PD.5
#define key_add (PIND&0x10)
#define key_sub (PIND&0x20)
//////////////////////////////////////////////
//時鐘8M
#define xtal 8
///////////電機步數的初始值,選擇尺寸影響步數,在select_key()中實現/////
unsigned int step_num1=8000;
unsigned int step_inc1=0;
unsigned int step_count1=0;
#define steps1 (step_num1+step_inc1)
/////////////
unsigned int step_num3=24000;
unsigned int step_inc3=0;
unsigned int step_count3=0;
#define steps3 (step_num3+step_inc3)
#define steps3_1 (steps3/3)
#define steps3_2 ((steps3/3)*2)
#define step3_ready 400
////////////
unsigned int step_num2=3200;
unsigned int step_inc2=0;
unsigned int step_count2=0;
#define steps2 (step_num2+step_inc2)
//////////////////////////////////////////////////////
unsigned int i=1;//延時用
unsigned int MD=8;//全局變量,密度初值
unsigned char count=0;//計張數
unsigned char keynum=5;//紙型初值
/////////////////////////////////////////////////////
/* 定義液晶OCMJ4X8端口 */
//DATA_PORT=PORTA
#define data_port PORTA
//ASK=PORTE.6
#define ask (PINE&0x40)
//ANSWER=PORTE.7
#define set_answer asm("sbi 0x03,7")
#define clr_answer asm("cbi 0x03,7")
//RESTE=PORTC.3
#define set_reset asm("sbi 0x18,7")
#define clr_reset asm("cbi 0x18,7")
#define wait asm("nop\n nop")
///////////////////////////////////////////////////////////
///////////////////////////////////////////////
const unsigned char num0[]={
/*-- 文字: 0 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x03,0xF0,0x06,0x38,
0x0E,0x18,0x0E,0x18,0x0C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,
0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x0C,0x1C,0x0E,0x1C,0x0E,0x18,
0x06,0x38,0x07,0x70,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num1[]={
/*-- 文字: 1 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x0F,0x80,
0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
0x01,0x80,0x1F,0xF0,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num2[]={
/*-- 文字: 2 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x0F,0xE0,0x1C,0xF0,
0x18,0x70,0x18,0x78,0x10,0x38,0x10,0x38,0x00,0x38,0x00,0x70,0x00,0x70,0x00,0x70,
0x00,0xE0,0x00,0xE0,0x01,0xC0,0x01,0x80,0x03,0x80,0x07,0x00,0x0E,0x08,0x0E,0x18,
0x1F,0xF8,0x3F,0xF8,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num3[]={
/*-- 文字: 3 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x07,0xF0,0x06,0x78,
0x0C,0x38,0x0C,0x18,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0xE0,0x03,0xF0,
0x01,0xF8,0x00,0x3C,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x0C,0x00,0x1C,0x0C,0x18,
0x1E,0x38,0x1F,0xE0,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num4[]={
/*-- 文字: 4 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x70,0x00,0xF0,
0x00,0xF0,0x01,0xF0,0x01,0xF0,0x03,0x70,0x06,0x70,0x06,0x70,0x0C,0x70,0x0C,0x70,
0x18,0x70,0x38,0x70,0x3F,0xFC,0x3F,0xFC,0x3F,0xFC,0x00,0x70,0x00,0x70,0x00,0x70,
0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num5[]={
/*-- 文字: 5 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,0x03,0xF8,0x03,0xF8,
0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0F,0x80,0x1F,0xE0,0x03,0xF0,0x00,0xF0,
0x00,0x38,0x00,0x38,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,
0x1C,0x60,0x1F,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num6[]={
/*-- 文字: 6 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xF0,0x01,0xC0,
0x03,0x00,0x07,0x00,0x0E,0x00,0x0E,0x00,0x0C,0x00,0x1C,0xC0,0x1F,0xF0,0x1F,0xF0,
0x1C,0x38,0x38,0x18,0x38,0x18,0x38,0x18,0x38,0x18,0x18,0x18,0x1C,0x18,0x1C,0x38,
0x1E,0x38,0x0F,0xF0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num7[]={
/*-- 文字: 7 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x0F,0xF8,0x1F,0xF8,
0x18,0x38,0x10,0x38,0x10,0x30,0x00,0x30,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,
0x00,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x03,0x80,
0x03,0x80,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num8[]={
/*-- 文字: 8 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x0F,0xF0,0x1C,0x30,
0x1C,0x38,0x18,0x38,0x1C,0x38,0x1C,0x38,0x1E,0x38,0x0E,0x70,0x0F,0xE0,0x07,0xC0,
0x07,0xC0,0x0F,0xE0,0x1C,0xF0,0x1C,0x78,0x18,0x38,0x38,0x38,0x38,0x18,0x18,0x18,
0x1C,0x38,0x0F,0xF0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char num9[]={
/*-- 文字: 9 --*/
/*-- 楷體_GB231224; 此字體下對應的點陣為:寬x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x0F,0xE0,0x0C,0x70,
0x1C,0x38,0x18,0x38,0x38,0x38,0x38,0x18,0x38,0x18,0x38,0x18,0x18,0x18,0x1C,0x38,
0x1C,0x78,0x0F,0xF8,0x07,0xB8,0x00,0x78,0x00,0x70,0x00,0x70,0x00,0xE0,0x01,0xC0,
0x03,0xC0,0x07,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
const unsigned char *base[10]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9};
//********************延時函數**************************************************
//xtal: 宏定義,為晶振頻率,單位為MHz
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for (i=0;i<n;i++)
for (j=1; j< (unsigned int)(xtal*143-2); j++);
}
/////////////////////////////////////////////////////////////////////////////////
void delay()//延時15ms
{
Delay_ms(15);
}
//////////////////////////////////////////////////////
//液晶操作子函數
////////////////////////////////////////////////////////
/* OCMJ4X8LCD初始化 */
void ocmj_init(void)
{
MCUCR=0;
DDRA=0xff;
PORTA=0xff;
DDRE=0b10000000;
PORTE=0xff;
clr_reset;//LCD復位
delay_ms(10);
set_reset;
clr_answer;
delay_ms(10);
}
/* 寫數據到LCD */
void ocmj_write(unsigned char data)
{
while(ask!=0)
;
data_port=data;
wait;
set_answer;
wait;
while(ask==0)
;
clr_answer;
}
/* 傳送32*32ICO點陣數據到LCD */
/* x:0~15(字節為單位) y:0~64 */
/* ico_p:指向圖形數據的指針 */
void ico_tran(unsigned char x,unsigned char y,const unsigned char *ico_p)
{
unsigned char i,j;
x+=4;
for(j=0;j<32;j++)
{
for(i=0;i<4;i++)
{
ocmj_write(0xf3);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*ico_p);
ico_p++;
x++;
}
x-=4;
y++;
}
}
/* 傳送bmp點陣數據到LCD */
/* x:0~15(字節為單位) y:0~64 */
/* bmp_p:指向圖形數據的指針 */
/* high:位圖高度(點陣行為單位) */
/* width:位圖寬度(以字節為單位)? */
void bmp_tran(unsigned char x,unsigned char y,unsigned char high,unsigned char width,const unsigned char *bmp_p)
{
unsigned char i,j;
x+=4;
for(j=0;j<high;j++)
{
for(i=0;i<width;i++)
{
ocmj_write(0xf3);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*bmp_p);
bmp_p++;
x++;
}
x-=width;
y++;
}
}
/* 傳送LCD內部漢字數據到LCD */
/* x:0x00~0x07 y:0x00~0x03 */
void hz_tran(unsigned char x,unsigned char y,unsigned char *hz_p)
{
x+=2;
while((*hz_p)!=0)
{
ocmj_write(0xf0);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*hz_p-0xa0);
hz_p++;
ocmj_write(*hz_p-0xa0);
hz_p++;
if(x<0x09)
x++;
else
{
x=0x02;
y++;
}
}
}
/* 傳送ASCII字母到LCD */
/* x:0x00~0x0f y:0~64 */
void asc_tran(unsigned char x,unsigned char y,unsigned char *asc_p)
{
x+=4;
while((*asc_p)!=0)
{
ocmj_write(0xf1);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*asc_p);
asc_p++;
if (x<0x13)
x++;
else
{
x=0x04;
y+=8;
}
}
}
////-----------------數字轉asc碼顯示--------------------///
void number(unsigned char x,unsigned char y,unsigned int num)
{
unsigned int box;
unsigned char i;
unsigned char temp[4];
unsigned char *char_p;
for(i=0;i<5;i++)
{
box=num%10+0x30;
temp[4-i]=(unsigned char)box;
num=num/10;
}
char_p=temp;
asc_tran( x,y,char_p);
}
/*---------------------數字傳輸--------------------------------------*/
void num_tran(unsigned char x,unsigned char y,unsigned char num)
{
unsigned char num1,num2;
if (num<10)
bmp_tran(x,y,32,2,base[num]);
else
{
num1=num/10;
num2=num%10;
bmp_tran(x,y,32,2,base[num1]);
bmp_tran(x+2,y,32,2,base[num2]);
}
}
//*********************************液晶顯示子程序*****************
//-----------待機與擴印張數顯示畫面-------------------//
void wcount_lcd(void)
{
ocmj_write(0xf4);//清屏
//顯示 待機中,您已印制 張
hz_tran(0,0,"待機中");
hz_tran(0,1,"您已印制");
hz_tran(6,1,"張");
hz_tran(0,3,"紙型");
hz_tran(3,3,"寸");
num_tran(4,36,keynum);
num_tran(8,9,count);
}
/*----------------設定步數畫面------------------------------------*/
void send_lcd(unsigned int i)
{
ocmj_write(0xf4);//清屏
hz_tran(1,0,"號電機設定步為");
hz_tran(1,2,"調整步數為");
switch (i)
{
case 1:/*顯示一,step_num1,step_inc1;*/
hz_tran(0,0,"一");
number(6,20,step_num1);
number(6,50,step_inc1);
break;
case 2:/*顯示二,step_num2,step_inc2;*/
hz_tran(0,0,"二");
number(2,20,step_num2);
number(2,50,step_inc2);
break;
case 3:/*顯示三,step_num3,step_inc3;*/
hz_tran(0,0,"三");
number(2,20,step_num3);
number(2,50,step_inc3);
break;
default: break;
}
}
//--------------開機畫面------------------------------//
void welcome(void)
{
ocmj_write(0xf4);//清屏
hz_tran(0,0,"歡迎您使用本設備");
hz_tran(0,1,"某某公司");
hz_tran(2,3,"竭誠為您服務");
}
//------------啟動時界面-------------------//
void start_lcd(void)
{
//啟動備紙中
ocmj_write(0xf4);//清屏
hz_tran(1,1,"啟動備紙中");
}
//------------曝光時界面--------------------//
void exposal_lcd(void)
{
ocmj_write(0xf4);//清屏
hz_tran(2,0,"顯影中");
hz_tran(1,2,"請不要按鍵");// 曝光中,請不要按鍵
}
//-----------紙張選型時界面--------------//
void selec_lcd(unsigned char i)
{
ocmj_write(0xf4);//清屏
hz_tran(0,1,"您選的紙型為");
hz_tran(7,1,"寸");//您選的紙型為 寸
num_tran(12,8,i);
// delay_ms(3000);
}
//*****************************************************************
///////////////////////////////////////////////////////
//128初始化函數
///////////////////////////////////////////////////////
/*
void timer1_init(void)
{
TCNT1H = 0x00; //setup
TCNT1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x3f;
OCR1BH = 0x00;
OCR1BL = 0x3f;
TCCR1A = 0xb9;
TCCR1B = 0x02; //start Timer
TIMSK = 0x05; //timer interrupt sources
SEI();
}
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
if(step_count3<=steps3)
step_count3++;
else
step_count3=0;
TCCR1B = 0x00;
}
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x00; //set count
OCR0 = 0x7f;
//TCCR0 = 0x7a;//快速pwm,64分頻。
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
if(step_count2<=steps2)
step_count2++;
else
step_count2=0;
TCCR0= 0x00;
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -