📄 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 + -